JavaScript高级程序设计(第3版)读书笔记
1.区分大小写:
变量、函数名和操作符都要区分大小写。大小写的不同分别表示不同的变量。
2.标识符:
变量、函数、属性、函数参数的名字。
注意:
- 开头必须字母、下划线、一个美元符号$
- 其他字符可以是字母、下划线、美元符号、数字。
- 也可以包含扩展的ASCII或Unicode字母。(不推荐)
起名:采用驼峰大小写格式:第一个字母小写,剩下的每个有意义的单词的首字母大写
例子:firstSecond、myCar
3.注释:
- 单行注视//
- 块级注释/ /
4.严格模式:
为JS定义一种不同的解析与执行模型。(对某些不安全的操作抛出错误)
**开启:在JS文件顶部添加'use strict';**
也可以在函数内部的上方包含这条指示。
**支持版本:IE10+、Firefox 4+、Safari 5.1+、Opera12+ 、谷歌**
5.语句:
每段代码都要以;结尾。
注意:
- 如果省略了分号,由解析器确定语句的结尾。
- 虽然可以省略,但是加上了这个分号可以避免很多错误,也可以增进代码的性能,解析器就不用推测哪里插入分号。
6.关键字和保留字:
关键字:语言保留的,不能用做标识符。
保留字:不能用做标识符的。
**注意:在严格/非严格模式下保留字会有少不同**
7.变量:
**js的变量是松散类型的,就是可以用来保存任何类型的数据。**
- Var message = 'hi';
- var message = 18;
注意:
- 变量刚开始存储'hi';然后被数字值100取代。(这种是可以的,但是不推荐)
- 用var修饰的变量,将成为定义该变量的作用域中的局部变量。
function test(){
var message = "hi";//局部
}
test();
alert(message);//错误
如果省略了var,从而创建了全句变量(严格模式下报错)
以上面的例子为例:
调用了test(),这个变量就有定义,就可以在函数外的任何地方被调用。
可以使用一条语句定义多个变量用逗号分开(可初始化,也可以不初始化):
var a,b,c;
Var a = 1,b='11',c=false;
8.数据类型(JS具有动态性):
1.**基本数据类型**:
- Undefined
- Null
- Boolean
- Number
- String
2.复杂数据类型:
object。
本质:由一组无序的名值对组成的。
注意:js不支持任何创建自定义类型的机制,而所有值最终都将是上述6种数据类型之一
3.typeof操作符:
检测给定变量的数据类型:typeof
使用typeo操作符可能返回以下情况:
- ‘undefined':这个值未定义。
- ‘boolean' :布尔值
- string : 字符串
- number : 数值
- object : 对象或null
- function : 函数
//typeof 可以数值或变量
var a = "some string";
alert(typeof a);
//typeof括号可以省略
alert(typeof (a));
alert(typeof 11);
注意:
- tupeof null 会返回 object. 特殊值:null被认为是一个空的对象引用;
- Safari5 、谷歌7之前的版本,对正则表达式调用typeof操作符会返回"function",而其他浏览器返回object.
注意:function也是个对象,不是一种数据类型,然而,函数也确实有一些特殊的属性,通过typeof操作区分函数和其他对象是必要的。
4.Undefined 类型:
Undefined 类型只有一个值,就是特殊的undefined.
**在使用var声明,但未对其初始化时,这个变量的值就是underined**
var message;
alert (message == undefined); ture
//声明了,但未对其进行初始化。
//显示
var message=undefined;
alret (message == undefined); ture
//不过,包含undefined的值的变量与尚未定义的变量还是不一样的。
var messgae;
//var age;
alert(message); //undefined
//使用alerg函数时尚未声明的变量age--会导致错误。
alert(age); //报错
如果都把age变量注释掉了:
//var age,
var message;
alret(type messgae); undefined;
alret(type age); undefined;
注意:即便未初始化变量会自动赋值undefinde,但是显示变量赋值是个明智的选择
5.Null类型:
Null类型是第二个只有一个值的数据类型,特殊的值是null.
null 代表着空对象指针.
typeof检测null,就会放回object
var car = null;
alert(typeof car); // object
注意:如果变量存储对象,请初始化null,而不是其他值。
只要直接检测null值就可以知道相应的变量是否已经保存了一个对象的引用:
if(car != null){
}
实际上,undefined值,来自null值的。
它们进行判断就是ture.
注意:它们有着这样关系,但是用途不一样
- 只要意在保存对象的变量还没有真正保存对象,就保存null
6.Boolean 类型:
两个值:true和false
注意:
- ture不一定等于1
- false不一定等于0
- 区分大小写
js所有类型的值都有与这两个不贰值等价的值
要将值转换对应的布尔值,Boolean()函数
var a = "11";
var message = Boolean(a); ture
转换规则:
ture:
- 任何非空字符串
- 非0数字值
- 任何对象
- n/a(不适用)
则反之
在控制语句中,自动执行相应的转换规则
var message = "11";
if(message){
alert("ok");
}
7.Number类型:
整数和浮点数值
整数:
- 十进制:10
- 八进制: 第一位必须0,然后八进制数字序列1(0-7),如果字面值中数值超出范围,前导0被忽略,后面当作十进制
- 八进制在严格模式无效
- 十六进制,开头0x,后面跟着十六进制数字(0-9以及A-F),字母可以大写也可以小写
- 算术计算时,八进制和十六进制表示的数值都被转换十进制数值
注意:正零和负0被认为相等
浮点数:
- 包含小数点,小数点后面至少有一位数字。(小数点前面可以没有整数)
- 保存的浮点数值的内存空间时整数的两倍(所以小数点没有任何数字。自动转换整数来保存。如果是一个整数1.0,那么更会自动转换了)
- 对于极大或极小的值,可以用e来表示,表示浮点数值
-
e表示:e前面的数值。乘以 10的指数次幂(即使是一个大写或小写的字母e)
var floatNum = 3.125e7 3.125 乘于十的七次方
5.e表示法,表示极小的数值
0.00000000000000003
3e-17
会把小数点六个0以上的浮点转换为e表示
6.浮点最高精度是17位小数。计算其精度不如整数
0.1+0.2 结构不是0.3,而是0.300000000004
if(a+b == 0.3){
alret("不要这样测试");
}
注意,永远不呀测试某个特定的浮点数值。
7.1数值范围:
注意:由于内存的限制,ECMAScript并不能保存世界上所有的数值。
js中能够表示的最小数值和最大的数值保存在Number.
MIN_VALUE:这个值是5e-324;
MAX_VALUE:这个值是1.7976931348623157e+308
**注意:计算的时候超过js数值范围的值,那么数值自动转换infinity值**
- 数值是负数,-infinity(负无穷)
- 数值是正数,infinity(正无穷)
注意:只要计算返回了正或负的infinnity值,将无法进行下一次的计算
确认最大值与最小值之间,可以使用isFinite()函数,如果在范围内,返回true
访问:
Number.NEGATIVB_INFINITY
Number.POSITUVE_INFINITY
得到 负 和 正 infinity
7.2 NaN:
即非数值,是一个特殊的数值。
表示一个本来要返回数值的操作数,未返回数值的情况。(不会抛出错误)
**注意:任何数除于0会返回NaN,不会影响其他代码的执行**
- 任何涉及NaN的操作(NaN/10)都会返回NaN,(多步计算有可能导致问题)
- NaN与任何值都不相等,包括NaN本身。
alert(NaN == NaN) //false
为针对上面情况:
isNaN()函数。
参数可以是任何类型,函数会帮我们,确定这个参数是否 “**不是数值**”。
它会尝试把参数这个值,转换为**数值**。不是数值的值会直接转换为数值。
不能被转换的数值的值都会导致这个函数返回true.
alert(isNaN(NaN)) ture
alert(isNaN(10)) false
alert(isNaN('10')) false
alert(isNaN('blue')) ture
alert(isNaN(ture)) false
- NaN本身,即非数值。
- 数值10和字符串10,能转换数值,返回了false
- blue不能转换数值
- true可以转换成数值1
Tips: isNaN也适合对象,在对象调用函数时,首先会调用对象的valueOF方法,然后确定该方法返回的值是否可以转换为数值。如果不能,基于这个返回值调用tostring方法,再测试返回值
7.3.数值转换:
非数值转换为数值函数:Number()、parseInt()、parseFloat
- Number:用于任何数据类型
- 其他两个,把字符串转换成数值
注意:这三个函数对于同样的输入会有返回不同的结果
Number转换规则:
- 布尔值,true和false,转换1和0
- 数字值,简单的传入和返回
- null,返回0
- undefined,返回NaN
-
字符串:
- 只包含数字(包含正负号情况),则将其转换十进制。(注意前导0会被忽略)
- 字符串是浮点,转换对应的浮点数值。(忽略前导零);
- 字符串是十六进制格式,转换相同大小的十进制整数
- 字符串是空,转换为0
- 除了以上的格式外的字符串,转换为NaN
6.如果对象,调用对象的valueOf(),然后按照上述的规则转换返回的值。如果结果是NaN,调用对象的toString()方法。然后再按照上述规则转换返回字符串值。
注意:该函数处理字符串毕竟复杂,不够合理,因此处理整数的时候更常用,parseInt()函数
parseint函数:
- 转换字符串时,看其是否符合数值模式。
- 忽略字符串前面的空格,直到找到第一个非空格字符串
- 如果第一个字符不是数字符串或着负号,返回NaN
- 用它转换空字符会返回NaN.
- 如果第一字符串是数字字符串,继续解析下一个,直到解析完所有或遇到非数字符串。例如:123blue,blue会被完全忽略,转换123.
- 如果是浮点数,22.5,会转换22,小数点并不是数字字符串。
- 如果字符串中的第一个字符是数字字符,识别各种整数格式(二、十、十六进制)。如果以"0x"开头会转换十六个进制。以0开头并且后面跟着数字,八进制来解析。
var a = parseInt("123blue") 123
var b = parseInt("") NaN
var c = parseInt("0xA"); 10
var d = parseInt("22.5") 22
var e = parseInt("070") 56
var f = praseInt("70") 70
vae g = praseInt("0xf") 15
注意:js3和js5,转换八进制的时候,有所不同,在js5中,前导0被认为无效,这个值当成0,严格模式也是如此
解决办法:
可以为parseint函数,提供第二参数,转换使用的基数(多少进制)
parseInt("0xAF",16); 175
parseInt("AF",16);175
parseInt("AF") NaN
注意:基数决定如何解析输入的字符串,避免了错误的解析,所以使用的时候,明确基数
parseFloat:
- 第一个字符串开始解析每一个,直到末尾或遇到无效的浮点数字字符为止。
- 字符串中第一个小数点有效,第二个无效,后面的字符串会被忽略。22.34.5 转换22。34
- 它会忽略前导0
- 十六进制格式字符串,始终转换0.。(只解析十进制,没有第二参数指定参数的用法)
- 如果字符串包含的是一个可解析为整数的数(没有小数点或着小数点后都是0),它会返回整数。
var a = parseFloat("123blue") 123
var b = parseFloat("OxA") 0
var c = parseFloat("22.5") 22.5
var d = parseFloat("22.34.5") 22.34
var e = parseFloat("0808.5")808.5
var f = parseFloat("3.125e7") 31250000
8.String类型:
表示由0个或多个16位Unicode字符组成的字符序列,字符串。
字符串由双引号或单引号表示。
**注意:双引号开头,必须以双引号结尾,单引号也是如此**
8.1 转义字符:表示非打印字符或具有其他用途的字符。
\n 换行
\t 制表
\b 空格
\r 回车
\f 进纸
\\ 注释
\* 在字符串中使用,表示单个‘字符串
\" 在字符串中使用,表示单个"
\xnn 以16进制代码nn表示的字符nn必须0-F
\unnnn 以16进制代码nnnn表示一个Unicode字符,n必须为0-F
var test = "this is the letter sigma: \u03a3."
长度28
6个转义字符表示1个字符。
如果字符串中包含双字节字符,那么length属性可能不会精确地返回字符串中的字符数目。
8.2 字符串特点:
**注意:JS中的字符串是不可变的,也就是,字符串一旦创建,它们的值就不能改变,**
要改变某个变量保存的字符串,必须先销毁原来的字符串,其次用另一个包含新值的字符串填充改变量
var lang = "Java";
lang = lang + "Script";
lang刚开始由java字符串组成。
第二行lang的值重新定义为"java与Script"组合:
1.创建能容纳10个字符的新字符串
2.然后在这个字符串中填充javascropt
3.最后销毁原来Java和字符串“Script"
这个过程在后台发生的,旧版本的浏览器中拼接字符串时速度很慢的原因所在
8.3 转换字符串:
一个值转换为另一个字符串有两种方式:
- toString()方法:数值、布尔值、对象、字符串都有这个方法,这个方法返回字符串中的一个副本,但是null和undefined值没有这个方法。
-
一般不需要在这方法括号传参数,但是数值调用的时候,可以传,进制数(基数)。
var age =11; var ageAsString = age.toString() 字符串11 var a =10; alert(a.toString(2)); 1010 注意:没有参数,默认基数10.
- 在不知道要转换的值是不是null或undefined,使用String(),能转换任何类型的值
String函数转换规则:
- 如果值有tostring方法,则调用该方法(没有参数)并返回相应的结果
- 如果值是null,则返回null
- 如果值是undefined,则返回undefined
var a = 10;
var b = true
var c = null;
var d;
string(a) 10
string(b) true
string(c) null
String(d); undefined
前两个个:跟调用toString函数,得到结果相同一样。
后两个,没有tostring方法,所以string函数就返回了这两个值的字面量。
9. Object 类型:
对象其实就是一组数据和功能的集合。
对象可以通过执行new操作符跟要创建对象类型的名称来创建
自定义对象:创建Object类型的实例并为其添加属性和方法
var o = new Object();
跟Java创建对象差不多。
如果不给构造函数传递参数,可以省略后面那一对括号。
var 0 = new Object//有效不推荐
理解一个重要思想:
Object 类型所具有的任何属性和方法同样存在于更具体的对象中。(Object根类)
Object的每个实例具有以下属性和方法:
- Constructor:保存着用于创建当前对象的函数。 构造函数:就是Object().
-
hasOwnProperty(propertyName):用于检查给定的属性是否在当前对象实例中(而不是在实例的原型中)。
参数属性名:必须字符串形势指定 :o.hasOwnProperty('name')
- isPrototypeof(Object):检查传入的对象是否是另一个对象的原型
- propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句。必须与字符串形势指定。
- toLocaleString():返回对象以字符串表示,该字符串与执行环境的地区对应
- toString():返回对象以字符串表示
- valueof():返回对象以字符串、数值、布尔值表示。与toString方法返回值相同。
注意:object是所有对象的基础,因此所有对象都具有这些基本的属性和方法
对象的行为不一定适用于JavaScript中的其他对象:
- 浏览器环境中的宿主对象:BOM、DOM
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。